//+------------------------------------------------------------------+
//|                                         ChartObjectsChannels.mqh |
//|                             Copyright 2000-2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
//| 包含所有图表通道对象类（等距通道、标准差通道、回归通道、安德鲁分叉线） |
//+------------------------------------------------------------------+
#include "ChartObjectsLines.h"  // 引入趋势线基类 CChartObjectTrend

//+------------------------------------------------------------------+
//| CChartObjectChannel 类（等距通道对象）                            |
//| 功能：MQL5图表等距通道对象，由三条平行线组成，用于标识价格波动区间   |
//| 继承关系：public CChartObjectTrend（基于趋势线基类，扩展通道特性）  |
//| 核心特性：                                                       |
//|  1. 由三个点定义：基线两点确定方向，第三点确定通道宽度              |
//|  2. 通道上下轨与基线平行，间距相等                                |
//|  3. 继承趋势线的颜色、线型、线宽等样式属性                        |
//+------------------------------------------------------------------+
class CChartObjectChannel : public CChartObjectTrend
  {
public:
   /**
    * @brief 构造函数：初始化等距通道对象
    * @details 调用父类 CChartObjectTrend 构造函数
    */
                     CChartObjectChannel(void);

   /**
    * @brief 析构函数：销毁等距通道对象
    * @details 依赖父类析构逻辑，自动删除图表上的通道对象
    */
                    ~CChartObjectChannel(void);

   /**
    * @brief 创建等距通道对象
    * @param chart_id [in] 目标图表ID（0表示当前图表）
    * @param name [in] 通道对象唯一名称
    * @param window [in] 子窗口编号（0=主窗口）
    * @param time1 [in] 第一个点的时间坐标
    * @param price1 [in] 第一个点的价格坐标
    * @param time2 [in] 第二个点的时间坐标（用于确定基线方向）
    * @param price2 [in] 第二个点的价格坐标
    * @param time3 [in] 第三个点的时间坐标（用于确定通道宽度）
    * @param price3 [in] 第三个点的价格坐标
    * @return bool - 创建结果：true表示成功，false表示失败
    */
   bool              Create(long chart_id,const string name,const int window,
                            const datetime time1,const double price1,
                            const datetime time2,const double price2,
                            const datetime time3,const double price3);

   /**
    * @brief 获取对象类型标识
    * @return int - 返回 OBJ_CHANNEL 表示等距通道类型
    */
   virtual int       Type(void) const { return(OBJ_CHANNEL); }
  };

//+------------------------------------------------------------------+
//| CChartObjectStdDevChannel 类（标准差通道对象）                     |
//| 功能：基于标准差计算的统计通道，用于标识价格围绕均线的波动范围       |
//| 继承关系：public CChartObjectTrend（基于趋势线基类）               |
//| 核心特性：                                                       |
//|  1. 由时间区间和标准差参数定义                                    |
//|  2. 中轨为期间价格的回归线，上下轨为中轨加减N个标准差               |
//|  3. 可调整标准差倍数改变通道宽度                                  |
//+------------------------------------------------------------------+
class CChartObjectStdDevChannel : public CChartObjectTrend
  {
public:
   /**
    * @brief 构造函数：初始化标准差通道对象
    */
                     CChartObjectStdDevChannel(void);

   /**
    * @brief 析构函数：销毁标准差通道对象
    */
                    ~CChartObjectStdDevChannel(void);

   /**
    * @brief 获取标准差倍数
    * @return double - 标准差倍数（如1.0、2.0）
    */
   double            Deviations(void) const;

   /**
    * @brief 设置标准差倍数
    * @param deviation [in] 新的标准差倍数（建议0.5-3.0范围）
    * @return bool - 设置结果：true表示成功
    */
   bool              Deviations(const double deviation) const;

   /**
    * @brief 创建标准差通道对象
    * @param chart_id [in] 目标图表ID
    * @param name [in] 通道对象唯一名称
    * @param window [in] 子窗口编号
    * @param time1 [in] 时间区间起始点
    * @param time2 [in] 时间区间结束点
    * @param deviation [in] 标准差倍数
    * @return bool - 创建结果：true表示成功
    */
   bool              Create(long chart_id,const string name,const int window,
                            const datetime time1,const datetime time2,const double deviation);

   /**
    * @brief 获取对象类型标识
    * @return int - 返回 OBJ_STDDEVCHANNEL 表示标准差通道类型
    */
   virtual int       Type(void) const { return(OBJ_STDDEVCHANNEL); }

   /**
    * @brief 将通道参数保存到文件
    * @param file_handle [in] 文件句柄
    * @return bool - 保存结果：true表示成功
    */
   virtual bool      Save(const int file_handle);

   /**
    * @brief 从文件加载通道参数
    * @param file_handle [in] 文件句柄
    * @return bool - 加载结果：true表示成功
    */
   virtual bool      Load(const int file_handle);
  };

//+------------------------------------------------------------------+
//| CChartObjectRegression 类（回归通道对象）                          |
//| 功能：基于线性回归的价格通道，用于分析价格趋势与波动范围           |
//| 继承关系：public CChartObjectTrend（基于趋势线基类）               |
//| 核心特性：                                                       |
//|  1. 由时间区间自动计算线性回归线作为中轨                          |
//|  2. 上下轨为价格与回归线的最大偏差值                              |
//|  3. 反映价格围绕趋势的波动特征                                    |
//+------------------------------------------------------------------+
class CChartObjectRegression : public CChartObjectTrend
  {
public:
   /**
    * @brief 构造函数：初始化回归通道对象
    */
                     CChartObjectRegression(void);

   /**
    * @brief 析构函数：销毁回归通道对象
    */
                    ~CChartObjectRegression(void);

   /**
    * @brief 创建回归通道对象
    * @param chart_id [in] 目标图表ID
    * @param name [in] 通道对象唯一名称
    * @param window [in] 子窗口编号
    * @param time1 [in] 时间区间起始点
    * @param time2 [in] 时间区间结束点
    * @return bool - 创建结果：true表示成功
    */
   bool              Create(long chart_id,const string name,const int window,
                            const datetime time1,const datetime time2);

   /**
    * @brief 获取对象类型标识
    * @return int - 返回 OBJ_REGRESSION 表示回归通道类型
    */
   virtual int       Type(void) const { return(OBJ_REGRESSION); }
  };

//+------------------------------------------------------------------+
//| CChartObjectPitchfork 类（安德鲁分叉线对象）                       |
//| 功能：安德鲁分叉线通道，用于预测价格趋势的潜在支撑与阻力位         |
//| 继承关系：public CChartObjectTrend（基于趋势线基类）               |
//| 核心特性：                                                       |
//|  1. 由三个点定义：起点、两个调整点形成的平行通道                  |
//|  2. 包含中轨和两条平行线，形成价格运行的潜在通道                  |
//|  3. 常用于识别趋势延续或反转的关键价位                            |
//+------------------------------------------------------------------+
class CChartObjectPitchfork : public CChartObjectTrend
  {
public:
   /**
    * @brief 构造函数：初始化安德鲁分叉线对象
    */
                     CChartObjectPitchfork(void);

   /**
    * @brief 析构函数：销毁安德鲁分叉线对象
    */
                    ~CChartObjectPitchfork(void);

   /**
    * @brief 创建安德鲁分叉线对象
    * @param chart_id [in] 目标图表ID
    * @param name [in] 通道对象唯一名称
    * @param window [in] 子窗口编号
    * @param time1 [in] 第一个点的时间坐标（起点）
    * @param price1 [in] 第一个点的价格坐标
    * @param time2 [in] 第二个点的时间坐标（调整点1）
    * @param price2 [in] 第二个点的价格坐标
    * @param time3 [in] 第三个点的时间坐标（调整点2）
    * @param price3 [in] 第三个点的价格坐标
    * @return bool - 创建结果：true表示成功
    */
   bool              Create(long chart_id,const string name,const int window,
                            const datetime time1,const double price1,
                            const datetime time2,const double price2,
                            const datetime time3,const double price3);

   /**
    * @brief 获取对象类型标识
    * @return int - 返回 OBJ_PITCHFORK 表示安德鲁分叉线类型
    */
   virtual int       Type(void) const { return(OBJ_PITCHFORK); }
  };
//+------------------------------------------------------------------+
